#ifndef VIDEO_STREAM_IPC
#define VIDEO_STREAM_IPC

#include <deque>
#include <semaphore.h>
#include <string>

#include <Client_types.h>
#include <NodeClient.h>
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TTransportUtils.h>

/**
 * @class VideoStreamIPC
 * @brief 通过IPC接口获取视频流
 * @note
 * Thrift和共享内存共用一个类
 *
 */
class VideoStreamIPC {
private:
  std::shared_ptr<apache::thrift::transport::TTransport> socket;
  std::shared_ptr<apache::thrift::transport::TTransport> transport;
  std::shared_ptr<apache::thrift::protocol::TProtocol> protocol;

  struct ShareMem {
    std::string name;
    int sharefd;
    unsigned char *sharemem;
    sem_t *sem;
    long memsize;
  };

  std::deque<ShareMem> shareMemList;
  std::unique_ptr<Thrift::NodeClientClient> IPCClient;
  /**
   * @brief 刷新列表
   * @todo
   * 需要加入去重，增加
   */
  void RefreshList();

public:
  /**
   * @brief 构造函数
   */
  VideoStreamIPC();
  /**
   * @brief 析构函数
   */
  virtual ~VideoStreamIPC();
  /**
   * @brief 启动与IPC的连接
   * @warning 需要在构造函数之后，其他函数之前调用该函数
   *
   * @param host 主机地址
   * @param port 端口
   */
  void Boot(const std::string &host, long port);
  /**
   * @brief 获取预览图像信息
   *
   * @param uuid 相机UUID
   */
  std::tuple<int /*Height*/, int /*Width*/, Thrift::ImageFormat::type>
  GetPreviewImageInf(const std::string &uuid);
  /**
   * @brief 获取实时图片列表
   */
  std::vector<std::string> GetRealtimeImageList();
  /**
   * @brief 获取实时图片流
   *
   * @param index 图片流索引
   * @param data 图片数据（由外部创建的指针）
   * @param size 图片数据大小
   */
  void GetRealtimeImage(int index, unsigned char *data, long size);
};

#endif
